package com.demo.a_proxy.b_cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyBeanFactory {
    
    public static UserServiceImpl createService(){
        //1.目标类
        final UserServiceImpl userService=new UserServiceImpl();
        //2.切面类
        final MyAspect myAspect=new MyAspect();
        /**
         * 3.代理类,采用cglib，底层创建目标类的子类
         */
        //3.1核心类
        Enhancer enhancer=new Enhancer();
        //3.2确定父类
        enhancer.setSuperclass(userService.getClass());
        /**3.3设置回调函数 MethodInterceptor接口等效jdk InvocationHandler接口
         *  intercept()等效jdk invoke()
         *  参数1,2,3相同
         *  3.4  methodProxy方法的代理
         *
         */
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                
                //前
                myAspect.before();
                //执行目标类的方法
                Object o = method.invoke(userService, args);
                // * 执行代理类的父类，执行目标类（目标类和代理类  父子关系 ）
                methodProxy.invokeSuper(proxy,args);
                //后
                myAspect.after();
                
                return o;
            }
        });
        //3.4 创建代理
        UserServiceImpl proxyService= (UserServiceImpl) enhancer.create();
        
        return proxyService;
    }
}
